home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 37
/
Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso
/
Aminet
/
text
/
edit
/
BareED.lha
/
BareED
/
source
/
CpyLib.asm
< prev
next >
Wrap
Assembly Source File
|
1997-02-07
|
6KB
|
288 lines
*******************************************************************
*:ts=15
*:fo=helvetica,13
*
*:ts=22
*:fo=times,15
*
*:ts=10
*:fo=diamond,12
*
*:ts=15
*:fo=ruby,15
*
** or any fixed-width-font, e.g.
*:ts=11
*:fo=excel,11
*
*
*
* TxtCharCopyA()
*
* This routine was written as a replacement for the stuff
* done in ANSI-C for "BareED".
*
* This routine can be used to copy overlayed, whilst non-
* overlayed copying is supported, too. It's more than 100%
* faster than its eqivalent (byte-copy) in ANSI-C.
* Does not require a MC68020 or higher or other specific
* stuff, runs with a plain MC68000.
*
* Copy-mode selected within routine; there are a couple of
* it avaiable.
*
* Calling convention:
*
* TxtCharCopyA( source-addr, dest-addr, length);
* void TxtCharCopyA( char *, char *, ULONG)
*
* IMPROVEMENTS:
* MEMORY ACCESS DRASTICALLY REDUCED
* MUCH FASTER ON A 68020 OR WHEN CACHES ARE DISABLED
* DRASTICALLY SHORTENED
* OPTIMIZED FOR 32BIT CPUs
*
* Can now be assembled using a68k.
*
*
* Copyright 1996/97/98/99 Jörg van de Loo
*
* $VER: TxtCharCopyA 2.0 (07.02.1997)
*
IFD __G2 ; HiSoft Devpac Amiga assembler?
OPT L+ ; Create link-able code
IDNT 'cpylib.asm'
MACHINE MC68000 ; Processor
OUTPUT cpylib.lib ; Where to store object?
ENDC
XDEF _TxtCharCopy
XDEF _TxtCharCopyA
include exec/execbase.i
SECTION TEXT,CODE
dc.b 'TXTCHARCOPY 2.0 © COPYRIGHT 1996-99 J.v.d.Loo'
CNOP 0,4
*
** C-entry point
*
_TxtCharCopy
movem.l 4(sp),A0-A1
move.l 12(sp),D0
*
** Source, Destination, size - calling convention "CopyMem()" alike
*
_TxtCharCopyA
movem.l D2-D6/A2,-(sp)
moveq #24,D3 ; Shif-values...
moveq #8,D4
cmpa.l A1,A0
bhi.w _ForwardCopy ; Ascend copy
move.l A0,D1 ; Check if we're going to
add.l D0,D1 ; copy 'overlayed'
cmp.l A1,D1
bls.w _ForwardCopy ; Ascend copy
* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
_ReverseCopy ; Descend copy
lea 0(A0,D0.l),A0
lea 0(A1,D0.l),A1
cmpi.l #32,D0 ; At least 33 bytes to copy?
bls.w .rbytecpy
move.l A0,D1
andi.b #1,D1
beq.s .rsrceven ; Source even
* --------------------------------- *
.rsrcodd
move.l A1,D1
andi.b #1,D1
bne.s .rbothodd
.rscrOddDestEven
* ---- Source is odd, destination is even --- *
.sode
movea.l (4).w,A2 ; 2478 0004 instead of 2479 0000 0004, Zero-Page = word addressing mode
move.w AttnFlags(A2),D1
andi.w #AFF_68020!AFF_68030!AFF_68040!AFF_68060,D1
bne.s .rbotheven ; Don't care about the limits of the 68000/08/10/12
move.l D0,D2 ; Amount
andi.l #-4,D2 ; Modulo 4
sub.l D2,D0 ; Compute rest
lsr.l #2,D2 ; Through 4 (number of longs)
subq.l #1,D2 ; 'Cause of 'Carry'
moveq #0,D1 ; No conflicts, please
move.b -(A0),D1 ; Get the even byte [ ___e ]
.sode1
move.l -(A0),D5 ; Get the even long [ abcd ]
move.l D5,D6 ; Save it for later [ abcd ]
lsl.l D4,D5 ; <<8 [ bcd_ ]
lsr.l D3,D6 ; >>24 [ ___a ]
or.l D1,D5 ; Join... [ bcde ]
move.l D5,-(A1) ; Store longword [ bcde ]
move.b D6,D1 ; D1 (byte) [ ___a ]
subq.l #1,D2 ; Decrease number of loops
bcc.s .sode1 ; If there is a rest...
addq.l #1,A0 ; One too far...
bra.s .rbytecpy
.rbothodd
* ---- Source is odd, destination is odd --- *
move.b -(A0),-(A1)
subq.l #1,D0 ; Now both even!
* ---- Source is even, destination is even --- * \\\\ Or we have CPU that can handle 32 bit addresses ////
.rbotheven
move.l D0,D2 ; Amount
andi.l #-32,D2 ; Modulo 32
sub.l D2,D0 ; Compute rest
lsr.l #5,D2 ; Through 32 (number of longs)
subq.l #1,D2 ; 'Cause of 'Carry'
.sede
move.l -(A0),-(A1)
move.l -(A0),-(A1)
move.l -(A0),-(A1)
move.l -(A0),-(A1)
move.l -(A0),-(A1)
move.l -(A0),-(A1)
move.l -(A0),-(A1)
move.l -(A0),-(A1)
subq.l #1,D2 ; Stored 32 bytes
bcc.s .sede ; A rest?
bra.s .rbytecpy
* --------------------------------- *
.rsrceven
move.l A1,D1
andi.b #1,D1
beq.s .rbotheven
.rsrcEvenDestOdd
* ---- Source is even, destination is odd --- *
.sedo
move.b -(A0),-(A1)
subq.l #1,D0
bra.s .sode ; Now source odd, destination even!
* ---- Check for rest of characters to copy --- *
.rbytecpy
tst.b D0
beq.s .rdone
.rbytecpyLoop
move.b -(A0),-(A1)
subq.b #1,D0
bne.s .rbytecpyLoop
.rdone
bra.w _TxtCharCopyDone
* %%%%%%%%%%%%%%%%%%%%%%%%%%%
_ForwardCopy
cmpi.l #32,D0 ; At least 33 bytes to copy?
bls.s .fbytecpy
move.l A0,D1
andi.b #1,D1
beq.s .fsrceven ; Source even
* --------------------------------- *
.fsrcodd
move.l A1,D1
andi.b #1,D1
bne.s .fbothodd
.fscrOddDestEven
* ---- Source is odd, destination is even --- *
.fsode
movea.l (4).w,A2
move.w AttnFlags(A2),D1
andi.w #AFF_68020!AFF_68030!AFF_68040!AFF_68060,D1
bne.s .fbotheven ; Don't care about the limit of the 68000
move.l D0,D2 ; Amount
andi.l #-4,D2 ; Modulo 4
sub.l D2,D0 ; Compute rest
lsr.l #2,D2 ; Through 4 (number of longs)
subq.l #1,D2 ; 'Cause of 'Carry'
move.b (A0)+,D1 ; The odd byte [ ><>a ]
.fsode1
lsl.l D3,D1 ; <<24 [ a___ ]
move.l (A0)+,D5 ; The even long [ bcde ]
move.b D5,D6 ; The odd byte [ ><>e ]
lsr.l D4,D5 ; >>8 [ _bcd ]
or.l D5,D1 ; Join... [ abcd ]
move.l D1,(A1)+ ; Store longword [ abcd ]
move.b D6,D1 ; D1 (byte) [ ><>e ]
subq.l #1,D2 ; Decrease number of loops
bcc.s .fsode1 ; If there is a rest...
subq.l #1,A0 ; One too far...
bra.s .fbytecpy
.fbothodd
* ---- Source is odd, destination is odd --- *
move.b (A0)+,(A1)+
subq.l #1,D0
* ---- Source is even, destination is even --- * \\\\ Or we have CPU that can handle 32 bit addresses ////
.fbotheven
move.l D0,D2 ; Amount
andi.l #-32,D2 ; Modulo 32
sub.l D2,D0 ; Compute rest
lsr.l #5,D2 ; Through 32 (number of longs)
subq.l #1,D2 ; 'Cause of 'Carry'
.fsede
move.l (A0)+,(A1)+
move.l (A0)+,(A1)+
move.l (A0)+,(A1)+
move.l (A0)+,(A1)+
move.l (A0)+,(A1)+
move.l (A0)+,(A1)+
move.l (A0)+,(A1)+
move.l (A0)+,(A1)+
subq.l #1,D2 ; Stored 32 bytes?
bcc.s .fsede ; A rest?
bra.s .fbytecpy
* --------------------------------- *
.fsrceven
move.l A1,D1
andi.b #1,D1
beq.s .fbotheven
.fsrcEvenDestOdd
* ---- Source is even, destination is odd --- *
move.b (A0)+,(A1)+
subq.l #1,D0
bra.s .fsode
.fbytecpy
tst.b D0
beq.s .fdone
.fbytecpyLoop
move.b (A0)+,(A1)+
subq.b #1,D0
bne.s .fbytecpyLoop
.fdone
* --------------------------------- *
_TxtCharCopyDone
movem.l (sp)+,D2-D6/A2
rts
END